//
//  DYWRefreshControl.swift
//  sinaWeibo
//
//  Created by 董艳武 on 16/3/4.
//  Copyright © 2016年 董艳武. All rights reserved.
//

import UIKit
import SnapKit

enum weiboRefreshStatus: Int {
    case Normal = 1 // 正常的初始化状态
    case Pulling = 2 // 准备刷新的状态
    case Refreshing = 3 // 正在刷新的状态
}

class DYWRefreshControl: UIControl {

    private let RefreshHeight:CGFloat = 60
    
    // 记录刷新时的状态
    var lastStatus:weiboRefreshStatus?
    
    
    // 声明状态属性
    var status:weiboRefreshStatus = .Normal {
        didSet {
            switch status {
            case .Normal :
                tipLabel.text = "下拉刷新"
                // 显示箭头
                self.arrowIcon.hidden = false
                // 菊花停止转动
                self.indicatorView.stopAnimating()
                // 恢复箭头
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    self.arrowIcon.transform = CGAffineTransformIdentity
                })
                if self.lastStatus == .Refreshing {
                    var inset = self.scrollView?.contentInset
                    inset?.top -= self.RefreshHeight
                    self.scrollView?.contentInset = inset!
                }

            case .Pulling:
                tipLabel.text = "松开刷新"
                // 旋转箭头
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    self.arrowIcon.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
                })
            case .Refreshing:
                tipLabel.text = "正在刷新"
                self.sendActionsForControlEvents(.ValueChanged)
                // 隐藏箭头
                self.arrowIcon.hidden = true
                // 显示菊花
                self.indicatorView.startAnimating()
                
                UIView.animateWithDuration(0.25, animations: { () -> Void in
                    var inset = self.scrollView?.contentInset
                    inset?.top += self.RefreshHeight
                    self.scrollView?.contentInset = inset!
                })
            }
            print(status)
            print(oldValue)
            lastStatus = status
            print(lastStatus)
        }
    }
    
    override init(frame: CGRect) {
        let rect = CGRect(x: 0, y: -RefreshHeight , width: screenWidth, height: 60)
        super.init(frame: rect)
//        self.backgroundColor = HotPink
        addUIs()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        setUpUIs()
    }
    
    
    // MARK:-- 懒加载控件
    // 文案
    private lazy var tipLabel : UILabel = UILabel(fontSize: 14, alignment: .Left, contentColor: UIColor.darkGrayColor(), isSizeToFit: true, lineCount: 1, labelText: "下拉刷新")
    // 箭头
    private lazy var arrowIcon:UIImageView = UIImageView(image: UIImage(named:"tableview_pull_refresh"))
    // 小菊花
    private lazy var indicatorView : UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
    // 懒加载背景图片
    private lazy var backImageView:UIImageView = UIImageView(image:UIImage(named: "refreshbg"))
    // 创建一个 scrollView 记录 父控件属性
    var scrollView : UIScrollView?
    // MARK:-- 添加 UI
    private func addUIs () {
        addSubview(backImageView)
        addSubview(tipLabel)
        addSubview(arrowIcon)
        addSubview(indicatorView)

    }
    // MARK:-- 设置 UI 
    private func setUpUIs () {
        
        backImageView.snp_makeConstraints { (make) -> Void in
            make.bottom.equalTo(self.snp_bottom)
            make.left.right.equalTo(self)
        }
        
        tipLabel.snp_makeConstraints { (make) -> Void in
            make.centerX.equalTo(self.snp_centerX).offset(15)
            make.centerY.equalTo(self.snp_centerY)
        }
        arrowIcon.snp_makeConstraints { (make) -> Void in
            make.right.equalTo(tipLabel.snp_left).offset(5)
            make.centerY.equalTo(self.snp_centerY)
        }
        indicatorView.snp_makeConstraints { (make) -> Void in
            make.center.equalTo(arrowIcon.snp_center)
        }
    }
    
    // MARK:-- 重写 UIView 的生命周期方法
    // 将要添加到父视图上 获取父视图
    override func willMoveToSuperview(newSuperview: UIView?) {
        super.willMoveToSuperview(newSuperview)
        // 判断下拉刷新的控件是否是 scrollView 及其子类
        if let fatherView = newSuperview as? UIScrollView {
            scrollView = fatherView
            // 观察俯视图的 contentOffSet 这个属性
            scrollView?.addObserver(self, forKeyPath: "contentOffset", options: NSKeyValueObservingOptions.New, context: nil)
        }
    }
    
    // MARK:-- KVO 观察方法 观察者相应方法
    // 实时的获取父视图的位移 根据位移和临界值实时进行对比 (临界值是124)
    // 需要实时的修改刷新的状态 1、正常的状态 2、等待刷新的状态 3、正在刷新的状态
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
//         print(change)
        // 1、 获取 tableView 在 垂直方法的位置
        /*
        总结：根据 tableView 的 contentOffset 的 y 值 （因为 tableViewController 在导航栏控制器中 contentOffset.y 就是导航栏的高度（64））下载到 下拉到下拉刷新控件自身的高度时，需要改变刷新的状态
        contentOffset.y 可以在 tableView 拖动的时候改变
        contentInset.top 的值是不可变的
        */
        // 是屏幕顶部距离 tableView 的顶部的距离
        let offSetY = scrollView?.contentOffset.y ?? 0
        
        let containValue = -(RefreshHeight + ( scrollView?.contentInset.top ?? 0))
       
        // contentInset 是 UIEdgeInsets 类型

        // 判断是否是在拽动
        /*
        逻辑：当超过临界值时  进入到等待刷新的状态，未超过临界值，此时是普通状态
        */
        
        if scrollView!.dragging {
            // 当 offSetY < containView 并且 status 被赋值为 .Normal 时
            if offSetY < containValue  && status == .Normal {
                print("下拉刷新,等待刷新的状态")
                status = .Pulling
            }  else if offSetY > containValue && status == .Pulling {
                print("普通状态")
                status = .Normal
            }
        } else {
            // 松手后才能进入到准备刷新状态
            // 并且进入等待刷新的状态
            if status == .Pulling {
                print("正在刷新")
                status = .Refreshing
            }
        }
    }
    // MARK:-- 移除观察者
    deinit {
        scrollView?.removeObserver(self, forKeyPath: "contentOffSet")
    }
}
extension DYWRefreshControl {
    func endRefreshing () {
        let time_t = dispatch_time(DISPATCH_TIME_NOW,Int64(Double(NSEC_PER_SEC) * 0.5))
        dispatch_after(time_t, dispatch_get_main_queue()) { () -> Void in
            self.status = .Normal
        }
        
    }
}